This is the code for the statistical analysis for “Vowel Acoustics as Predictors of Speech Intelligibility in Dysarthria.”

Loading Packages


library(rio)
library(tidyverse)
library(irr) # install.packages('irr')
library(performance)
library(car)
library(ggpubr)
library("Hmisc") # install.packages('Hmisc')
library(ggridges)
library(furniture) # install.packages('furniture')
library(gt)
library(patchwork)
library(ks)
library(emuR) # install.packages('emuR')
library(geomtextpath) # remotes::install_github("AllanCameron/geomtextpath")

Upload Datasets


Reliability <- rio::import("Prepped Data/Reliability Data.csv")
AcousticData <- rio::import("Prepped Data/AcousticMeasures.csv") %>%
  dplyr::mutate(intDiff = VAS - transAcc)

AcousticData <- AcousticData %>%
  dplyr::filter(!grepl("_rel", Speaker)) %>%
  dplyr::select(c(Speaker, Sex, Etiology, vowel_ED_b, VSA_b, Hull_b, Hull_bVSD_25, Hull_bVSD_50, Hull_bVSD_75, VAS, transAcc))

Listeners <- rio::import("Prepped Data/Listener_Demographics.csv") %>%
  dplyr::select(!c(StartDate:proloficID, Q2.4_6_TEXT, Q3.2_8_TEXT, AudioCheck:EP3))

Listeners$race[Listeners$Q3.3_7_TEXT == "Native American/ African amercing"] <- "Biracial or Multiracial"

Alternate Analysis

In this alternate analysis, we are looking at the relationship between these acoustic measures with speech intelligibility for the ALS/PD and the HD/Ataxic speakers separately. We create a new variable called Incoord, where the ALS/PD Speakers are set as the reference group (in order to compare to the Ataxic/HD Speaker Group). Group Comparisons, additional data visualizations, and further linear model comparisons are completed.

Data Prep


# Creating a new variable in AcousticData. Incoord is a dummy variable. ALS/PD Speakers = 0, HD/Ataxic = 1

AcousticData <- AcousticData %>%
  dplyr::mutate(Incoord = case_when(Etiology == "HD" ~ 1,
                                    Etiology == "Ataxic" ~ 1,
                                    TRUE ~ 0)) %>%
  dplyr::mutate(Incoord = as.factor(Incoord))

Descriptives


Descriptives_ALS.PD_incoord <- AcousticData %>%
  dplyr::group_by(Incoord) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Descriptives_ALS.PD_incoord
NA

Data Vis

Group Comparison Ridgeline Plots


# VSA Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VSA_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Area (Bark)") +
  theme_classic()

# Corner Dispersion Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

disp_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Corner Dispersion (Bark)") +
  theme_classic()

# Hull Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

hull_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Hull (Bark)") +
  theme_classic()

# VSD 25 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd25_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 25 (Bark)") +
  theme_classic()

# VSD 50 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd50_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_50,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 50 (Bark)") +
  theme_classic()

# VSD 75 Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

vsd75_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Vowel Space Desnity 75 (Bark)") +
  theme_classic()

# Orthographic Transcription Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

OT_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = transAcc,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Percent Words Correct") +
  theme_classic()

# Visual Analog Scale Intelligibility Rating Ridgeline Plot by Incoordination (Incoord = 0 are ALS/PD Speakers, Incoord == 1 are HD/Ataxic Speakers)

VAS_incoord.plot <- AcousticData %>%
  ggplot() +
  aes(x = VAS,
      y = Incoord,
      color = Incoord,
      fill = Incoord) +
  geom_density_ridges(jittered_points = T, 
                      position = position_points_jitter(width = 0.01, height = 0), 
                      point_shape = '|', 
                      point_size = 5,
                      point_alpha = 1,
                      alpha = 0.7,
                      scale = .7) +
  xlab("Ratigns") +
  theme_classic()

# Creating Distributions by Incoord Figure

Distributions_incoord <- ggpubr::ggarrange(VSA_incoord.plot, disp_incoord.plot, hull_incoord.plot, vsd25_incoord.plot, vsd50_incoord.plot, vsd75_incoord.plot, OT_incoord.plot, VAS_incoord.plot,
                  ncol = 2,
                  nrow = 4)
Picking joint bandwidth of 0.637
Picking joint bandwidth of 0.144
Picking joint bandwidth of 3.74
Picking joint bandwidth of 3.27
Picking joint bandwidth of 1.93
Picking joint bandwidth of 0.764
Picking joint bandwidth of 10.1
Picking joint bandwidth of 13
# Saving Distribution Figure

ggsave("Plots/Distribution_incoord.png", plot = last_plot(), width = 10, height = 10, unit = "in")

Scatterplots


# OT Scatterplots by Incoord

OT_VSA.incoord <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Area (Bark)") +
  ylab("Percent Words Correct") +
  ggtitle("Orthographic Transcription") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

OT_disp.incoord <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Corner Dispersion (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_Hull.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Hull (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd25.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 25 (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

OT_vsd75.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = transAcc,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 75 (Bark)") +
  ylab("Percent Words Correct") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()


# VAS Scatterplots

VAS_VSA.incoord <- AcousticData %>%
  ggplot() +
  aes(x = VSA_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Area (Bark)") +
  ylab("VAS Score") +
  ggtitle("Visual Analog Scale") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))

VAS_disp.incoord <- AcousticData %>%
  ggplot() +
  aes(x = vowel_ED_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Corner Dispersion (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_Hull.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_b,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Hull (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd25.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_25,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 25 (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()

VAS_vsd75.incoord <- AcousticData %>%
  ggplot() +
  aes(x = Hull_bVSD_75,
      y = VAS,
      color = Incoord) +
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  xlab("Vowel Space Density 75 (Bark)") +
  ylab("VAS Score") +
  coord_cartesian(ylim = c(0,100)) +
  theme_classic()


# Creating Scatterplot Figure

Scatterplots_incoord <- ggpubr::ggarrange(OT_VSA.incoord, VAS_VSA.incoord, OT_disp.incoord, VAS_disp.incoord, OT_Hull.incoord, VAS_Hull.incoord, OT_vsd25.incoord, VAS_vsd25.incoord, OT_vsd75.incoord, VAS_vsd75.incoord,
                  ncol = 2,
                  nrow = 5)

## Saving Scatterplot Figure

ggsave("Plots/Scatterplots_incoord.png", plot = last_plot(), width = 15, height = 20, unit = "in", scale = .5)

Group Comparisons - 4 Groups

Means and SD


AcousticData %>%
  dplyr::group_by(Sex, Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

AcousticData %>%
  dplyr::group_by(Sex) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

AcousticData %>%
  dplyr::group_by(Etiology) %>%
  dplyr::summarize(VSA_mean = mean(VSA_b, na.rm =T), VSA_sd = sd(VSA_b, na.rm = T),
                   Disp_mean = mean(vowel_ED_b, na.rm =T), Disp_sd = sd(vowel_ED_b, na.rm =T),
                   Hull_mean = mean(Hull_b, na.rm =T), Hull_sd = sd(Hull_b, na.rm =T),
                   VSD25_mean = mean(Hull_bVSD_25, na.rm =T), VSD25_sd = sd(Hull_bVSD_25, na.rm =T),
                   VSD50_mean = mean(Hull_bVSD_50, na.rm =T), VSD50_sd = sd(Hull_bVSD_50, na.rm =T),
                   VSD75_mean = mean(Hull_bVSD_75, na.rm =T), VSD75_sd = sd(Hull_bVSD_75, na.rm =T),
                   VAS_mean = mean(VAS, na.rm =T), VAS_sd = sd(VAS, na.rm =T),
                   OT_mean = mean(transAcc, na.rm =T), OT_sd = sd(transAcc, na.rm =T))

Acoustic Measures

VSA


## Specify the Model
VSA_group <- aov(VSA_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(VSA_group, 1)
plot(VSA_group, 2)
car::leveneTest(VSA_group)
VSA_residuals <- residuals(object = VSA_group)
shapiro.test(VSA_residuals)

## Model Results

summary(VSA_group)

## Kruskal-Wallis Test 

kruskal.test(VSA_b ~ Etiology, data = AcousticData)

## Pairwise Comparisons

pairwise.wilcox.test(AcousticData$VSA_b, AcousticData$Etiology, p.adjust.method = "bonferroni")

Corner Dispersion


## Specify the Model
disp_group <- aov(vowel_ED_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(disp_group, 1)
plot(disp_group, 2)
car::leveneTest(disp_group)
disp_residuals <- residuals(object = disp_group)
shapiro.test(disp_residuals)

## Model Results

summary(disp_group)

Hull


## Specify the Model
hull_group <- aov(Hull_b ~ Etiology, data = AcousticData)

## Assumption Check

plot(hull_group, 1)
plot(hull_group, 2)
car::leveneTest(hull_group)
hull_residuals <- residuals(object = hull_group)
shapiro.test(hull_residuals)

## Model Results

summary(hull_group)

VSD 25


## Specify the Model
vsd25_group <- aov(Hull_bVSD_25 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd25_group, 1)
plot(vsd25_group, 2)
car::leveneTest(vsd25_group)
vsd25_residuals <- residuals(object = vsd25_group)
shapiro.test(vsd25_residuals)

## Model Summary

summary(vsd25_group)

VSD 50


## Specify the Model
vsd50_group <- aov(Hull_bVSD_50 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd50_group, 1)
plot(vsd50_group, 2)
car::leveneTest(vsd50_group)
vsd50_residuals <- residuals(object = vsd50_group)
shapiro.test(vsd50_residuals)

## Model Results

summary(vsd50_group)

## Kruskal Wallis Test

kruskal.test(Hull_bVSD_50 ~ Etiology, data = AcousticData)

VSD 75


## Specify the Model
vsd75_group <- aov(Hull_bVSD_75 ~ Etiology, data = AcousticData)

## Assumption Check

plot(vsd75_group, 1)
plot(vsd75_group, 2)
car::leveneTest(vsd75_group)
vsd75_residuals <- residuals(object = vsd75_group)
shapiro.test(vsd75_residuals)

## Model Summary

summary(vsd75_group)

## Kruskal Wallis

kruskal.test(Hull_bVSD_75 ~ Etiology, data = AcousticData)

Group Comparisons - 2 Groups

Two Dataframes for Incoord Groups


coord.group <- AcousticData %>%
  dplyr::filter(Incoord == 0)

incoord.group <- AcousticData %>%
  dplyr::filter(Incoord == 1)

VSA


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VSA_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  VSA_b[Incoord == 0]
W = 0.94206, p-value = 0.2622
with(AcousticData, shapiro.test(VSA_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  VSA_b[Incoord == 1]
W = 0.81843, p-value = 0.001648
## Equal Variance Check

res.ftest.VSA <- var.test(VSA_b ~ Incoord, data = AcousticData)
res.ftest.VSA

    F test to compare two variances

data:  VSA_b by Incoord
F = 0.66898, num df = 19, denom df = 19, p-value = 0.3888
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.2647915 1.6901522
sample estimates:
ratio of variances 
         0.6689828 
# Model Results

VSA_b_t <- t.test(incoord.group$VSA_b, coord.group$VSA_b, var.equal = T)
VSA_b_t

    Two Sample t-test

data:  incoord.group$VSA_b and coord.group$VSA_b
t = 2.8889, df = 38, p-value = 0.006352
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.519310 2.951478
sample estimates:
mean of x mean of y 
 5.289125  3.553732 

Corner Dispersion


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  vowel_ED_b[Incoord == 0]
W = 0.93799, p-value = 0.2197
with(AcousticData, shapiro.test(vowel_ED_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  vowel_ED_b[Incoord == 1]
W = 0.9837, p-value = 0.9725
## Equal Variance Check

res.ftest.disp <- var.test(vowel_ED_b ~ Incoord, data = AcousticData)
res.ftest.disp

    F test to compare two variances

data:  vowel_ED_b by Incoord
F = 1.2328, num df = 19, denom df = 19, p-value = 0.6528
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4879679 3.1146765
sample estimates:
ratio of variances 
          1.232827 
# Model Results

disp_t <- t.test(incoord.group$vowel_ED_b, coord.group$vowel_ED_b, var.equal = T)
disp_t

    Two Sample t-test

data:  incoord.group$vowel_ED_b and coord.group$vowel_ED_b
t = 2.031, df = 38, p-value = 0.04929
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.000790061 0.485404644
sample estimates:
mean of x mean of y 
 2.165220  1.922123 

Hull


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_b[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_b[Incoord == 0]
W = 0.93152, p-value = 0.1652
with(AcousticData, shapiro.test(Hull_b[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_b[Incoord == 1]
W = 0.96708, p-value = 0.6923
## Equal Variance Check

res.ftest.hull <- var.test(Hull_b ~ Incoord, data = AcousticData)
res.ftest.hull

    F test to compare two variances

data:  Hull_b by Incoord
F = 1.7881, num df = 19, denom df = 19, p-value = 0.2144
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.7077388 4.5174646
sample estimates:
ratio of variances 
          1.788067 
# Model Results

hull_t <- t.test(incoord.group$Hull_b, coord.group$Hull_b, var.equal = T)
hull_t

    Two Sample t-test

data:  incoord.group$Hull_b and coord.group$Hull_b
t = 2.4391, df = 38, p-value = 0.0195
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  1.084279 11.670189
sample estimates:
mean of x mean of y 
 34.14243  27.76520 

VSD 25


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_25[Incoord == 0]
W = 0.93529, p-value = 0.1951
with(AcousticData, shapiro.test(Hull_bVSD_25[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_25[Incoord == 1]
W = 0.966, p-value = 0.6692
## Equal Variance Check

res.ftest.vsd25 <- var.test(Hull_bVSD_25 ~ Incoord, data = AcousticData)
res.ftest.vsd25

    F test to compare two variances

data:  Hull_bVSD_25 by Incoord
F = 1.2396, num df = 19, denom df = 19, p-value = 0.6444
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4906358 3.1317059
sample estimates:
ratio of variances 
          1.239567 
# Model Results

vsd25_t <- t.test(incoord.group$Hull_bVSD_25, coord.group$Hull_bVSD_25, var.equal = T)
vsd25_t

    Two Sample t-test

data:  incoord.group$Hull_bVSD_25 and coord.group$Hull_bVSD_25
t = 1.4368, df = 38, p-value = 0.159
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.234943  7.274708
sample estimates:
mean of x mean of y 
 17.36480  14.34491 

VSD 50


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 0]))
with(AcousticData, shapiro.test(Hull_bVSD_50[Incoord == 1]))

## Equal Variance Check

res.ftest.vsd50 <- var.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
res.ftest.vsd50

# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd50_MW <- wilcox.test(Hull_bVSD_50 ~ Incoord, data = AcousticData)
vsd50_MW

VSD 75


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 0]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_75[Incoord == 0]
W = 0.69079, p-value = 3.017e-05
with(AcousticData, shapiro.test(Hull_bVSD_75[Incoord == 1]))

    Shapiro-Wilk normality test

data:  Hull_bVSD_75[Incoord == 1]
W = 0.84373, p-value = 0.004193
## Equal Variance Check

res.ftest.vsd75 <- var.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
res.ftest.vsd75

    F test to compare two variances

data:  Hull_bVSD_75 by Incoord
F = 1.1578, num df = 19, denom df = 19, p-value = 0.7527
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4582864 2.9252210
sample estimates:
ratio of variances 
          1.157838 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

vsd75_MW <- wilcox.test(Hull_bVSD_75 ~ Incoord, data = AcousticData)
vsd75_MW

    Wilcoxon rank sum exact test

data:  Hull_bVSD_75 by Incoord
W = 160, p-value = 0.2888
alternative hypothesis: true location shift is not equal to 0

Orthographic Transcription Scores


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(transAcc[Incoord == 0]))

    Shapiro-Wilk normality test

data:  transAcc[Incoord == 0]
W = 0.87029, p-value = 0.01189
with(AcousticData, shapiro.test(transAcc[Incoord == 1]))

    Shapiro-Wilk normality test

data:  transAcc[Incoord == 1]
W = 0.91581, p-value = 0.0823
## Equal Variance Check

res.ftest.OT <- var.test(transAcc ~ Incoord, data = AcousticData)
res.ftest.OT

    F test to compare two variances

data:  transAcc by Incoord
F = 1.082, num df = 19, denom df = 19, p-value = 0.8654
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4282721 2.7336414
sample estimates:
ratio of variances 
          1.082009 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(transAcc ~ Incoord, data = AcousticData)
OT_MW

    Wilcoxon rank sum exact test

data:  transAcc by Incoord
W = 194, p-value = 0.8831
alternative hypothesis: true location shift is not equal to 0

VAS


# Assumption Check

## Checking Normality

with(AcousticData, shapiro.test(VAS[Incoord == 0]))

    Shapiro-Wilk normality test

data:  VAS[Incoord == 0]
W = 0.87506, p-value = 0.01444
with(AcousticData, shapiro.test(VAS[Incoord == 1]))

    Shapiro-Wilk normality test

data:  VAS[Incoord == 1]
W = 0.91494, p-value = 0.07923
## Equal Variance Check

res.ftest.VAS <- var.test(VAS ~ Incoord, data = AcousticData)
res.ftest.VAS

    F test to compare two variances

data:  VAS by Incoord
F = 1.0744, num df = 19, denom df = 19, p-value = 0.8774
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4252539 2.7143765
sample estimates:
ratio of variances 
          1.074383 
# Model Results (Mann-Whitney U test conducted since assumption of normality is violated)

OT_MW <- wilcox.test(VAS ~ Incoord, data = AcousticData)
OT_MW

    Wilcoxon rank sum exact test

data:  VAS by Incoord
W = 207, p-value = 0.862
alternative hypothesis: true location shift is not equal to 0

OT Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the heirarichal regression approach from OT Model 5. Adding in the Incoord predictor along with the interactions between the acoustic measures did not significantly improve model fit. So our original final OT model is retained.

Model 6


## Specifying Model 6

OT_Model6 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(OT_Model6)


## Model 6 Summary

summary(OT_Model6)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.105 -11.266   4.121  13.717  31.536 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)   17.5375    21.0257   0.834   0.4102  
Hull_bVSD_25  -1.6809     1.1892  -1.413   0.1669  
Hull_bVSD_75   0.9833     2.1390   0.460   0.6487  
Hull_b         1.0629     0.7946   1.338   0.1901  
VSA_b          6.5678     2.6475   2.481   0.0184 *
vowel_ED_b     4.8102    12.8358   0.375   0.7102  
Incoord1     -12.8123     7.6496  -1.675   0.1034  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.02 on 33 degrees of freedom
Multiple R-squared:  0.346, Adjusted R-squared:  0.2271 
F-statistic:  2.91 on 6 and 33 DF,  p-value: 0.02173
## Model 5 and Model 6 Comparison

anova(OT_Model5, OT_Model6)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     34 15823                           
2     33 14583  1    1239.7 2.8053 0.1034

Model 7


## Specifying Model 7

OT_Model7 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(OT_Model7)


## Model 7 Summary

summary(OT_Model7)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.665 -10.983   4.212  14.044  31.363 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.3827    22.9018   0.846   0.4036  
Hull_bVSD_25           -1.7865     1.2973  -1.377   0.1780  
Hull_bVSD_75            0.8920     2.2093   0.404   0.6891  
Hull_b                  1.0871     0.8136   1.336   0.1909  
VSA_b                   6.5883     2.6881   2.451   0.0199 *
vowel_ED_b              4.3440    13.1935   0.329   0.7441  
Incoord1              -16.7140    19.2373  -0.869   0.3914  
Hull_bVSD_25:Incoord1   0.2417     1.0905   0.222   0.8260  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.33 on 32 degrees of freedom
Multiple R-squared:  0.347, Adjusted R-squared:  0.2042 
F-statistic: 2.429 on 7 and 32 DF,  p-value: 0.04086
## Model 6 and Model 7 Comparison

anova(OT_Model6, OT_Model7)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     33 14583                           
2     32 14561  1    22.358 0.0491  0.826

Model 8


## Specifying Model 8

OT_Model8 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(OT_Model8)


## Model 8 Summary

summary(OT_Model8)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.858 -12.366   6.261  13.135  30.401 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            19.4909    22.7677   0.856   0.3985  
Hull_bVSD_25           -1.4002     1.3310  -1.052   0.3009  
Hull_bVSD_75           -0.7590     2.6079  -0.291   0.7730  
Hull_b                  0.9879     0.8132   1.215   0.2336  
VSA_b                   6.8700     2.6831   2.560   0.0155 *
vowel_ED_b              4.0042    13.1193   0.305   0.7622  
Incoord1               -6.3149    21.0758  -0.300   0.7665  
Hull_bVSD_25:Incoord1  -1.1508     1.6068  -0.716   0.4792  
Hull_bVSD_75:Incoord1   5.4156     4.6125   1.174   0.2493  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.21 on 31 degrees of freedom
Multiple R-squared:  0.3748,    Adjusted R-squared:  0.2135 
F-statistic: 2.323 on 8 and 31 DF,  p-value: 0.04412
## Model 7 and Model 8 Comparison

anova(OT_Model7, OT_Model8)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     32 14561                           
2     31 13941  1    619.94 1.3786 0.2493

Model 9


## Specifying Model 9

OT_Model9 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(OT_Model9)


## Model 9 Summary

summary(OT_Model9)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.387 -11.747   5.389  14.794  30.552 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            22.2613    23.3541   0.953   0.3481  
Hull_bVSD_25           -0.8239     1.6003  -0.515   0.6104  
Hull_bVSD_75           -1.1104     2.6847  -0.414   0.6821  
Hull_b                  0.5095     1.0933   0.466   0.6446  
VSA_b                   6.9293     2.7092   2.558   0.0158 *
vowel_ED_b              5.4227    13.4118   0.404   0.6888  
Incoord1              -22.3892    32.2682  -0.694   0.4931  
Hull_bVSD_25:Incoord1  -2.4414     2.5348  -0.963   0.3432  
Hull_bVSD_75:Incoord1   6.0684     4.7580   1.275   0.2120  
Hull_b:Incoord1         1.1098     1.6753   0.662   0.5128  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 21.4 on 30 degrees of freedom
Multiple R-squared:  0.3838,    Adjusted R-squared:  0.199 
F-statistic: 2.076 on 9 and 30 DF,  p-value: 0.06468
## Model 8 and Model 9 Comparison

anova(OT_Model8, OT_Model9)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     31 13941                           
2     30 13740  1    200.96 0.4388 0.5128

Model 10


## Specifying Model 10

OT_Model10 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(OT_Model10)


## Model 10 Summary

summary(OT_Model10)

Call:
lm(formula = transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + 
    VSA_b + vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-43.360 -12.039   5.446  15.103  30.988 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)
(Intercept)            22.5101    23.8532   0.944    0.353
Hull_bVSD_25           -0.8290     1.6280  -0.509    0.614
Hull_bVSD_75           -1.1292     2.7353  -0.413    0.683
Hull_b                  0.4795     1.1439   0.419    0.678
VSA_b                   7.3071     4.3698   1.672    0.105
vowel_ED_b              5.0854    13.9703   0.364    0.718
Incoord1              -21.7310    33.3409  -0.652    0.520
Hull_bVSD_25:Incoord1  -2.3862     2.6248  -0.909    0.371
Hull_bVSD_75:Incoord1   6.0316     4.8495   1.244    0.224
Hull_b:Incoord1         1.1357     1.7194   0.660    0.514
VSA_b:Incoord1         -0.5224     4.6911  -0.111    0.912

Residual standard error: 21.76 on 29 degrees of freedom
Multiple R-squared:  0.3841,    Adjusted R-squared:  0.1717 
F-statistic: 1.809 on 10 and 29 DF,  p-value: 0.1038
## Model 9 and Model 10 Comparison

anova(OT_Model9, OT_Model10)
Analysis of Variance Table

Model 1: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
Model 2: transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     30 13740                           
2     29 13734  1    5.8732 0.0124 0.9121

Model 11


## Specifying Model 11

OT_Model11 <- lm(transAcc ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(OT_Model11)

## Model 11 Summary

summary(OT_Model11)

## Model 10 and Model 11 Comparison

anova(OT_Model10, OT_Model11)

VAS Analysis

Since we found significant group differences for some acoustic measures between the ALS/PD and Ataxic/HD groups, we continued the hierarchical regression approach from VAS Model 5. VAS Model 6 fit significantly better than VAS Model 5. However, adding in the interactions between Incoord and the acoustic measures did not significantly improve model fit.

Model 6


## Specifying Model 6

VAS_Model6 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + Incoord, data = AcousticData)

## Model 6 Assumption Check

performance::check_model(VAS_Model6)


## Model 6 Summary

summary(VAS_Model6)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.188 -13.751   2.167  16.256  36.926 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)    8.6850    22.7911   0.381   0.7056  
Hull_bVSD_25  -2.1615     1.2891  -1.677   0.1030  
Hull_bVSD_75   1.7100     2.3186   0.738   0.4660  
Hull_b         1.2359     0.8613   1.435   0.1607  
VSA_b          7.4668     2.8698   2.602   0.0138 *
vowel_ED_b     5.5718    13.9135   0.400   0.6914  
Incoord1     -17.9628     8.2919  -2.166   0.0376 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.79 on 33 degrees of freedom
Multiple R-squared:  0.3632,    Adjusted R-squared:  0.2474 
F-statistic: 3.137 on 6 and 33 DF,  p-value: 0.0152
## Model 5 and Model 6 Comparison

anova(VAS_Model5, VAS_Model6)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
1     34 19572                              
2     33 17135  1    2436.7 4.6929 0.03761 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model 7


## Specifying Model 7

VAS_Model7 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25, data = AcousticData)

## Model 7 Assumption Check

performance::check_model(VAS_Model7)


## Model 7 Summary

summary(VAS_Model7)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.039 -14.972   3.129  15.900  35.174 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            13.6424    24.7265   0.552   0.5850  
Hull_bVSD_25           -2.4451     1.4006  -1.746   0.0905 .
Hull_bVSD_75            1.4646     2.3853   0.614   0.5435  
Hull_b                  1.3009     0.8784   1.481   0.1484  
VSA_b                   7.5218     2.9023   2.592   0.0143 *
vowel_ED_b              4.3193    14.2447   0.303   0.7637  
Incoord1              -28.4451    20.7701  -1.370   0.1804  
Hull_bVSD_25:Incoord1   0.6494     1.1773   0.552   0.5851  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.03 on 32 degrees of freedom
Multiple R-squared:  0.3692,    Adjusted R-squared:  0.2312 
F-statistic: 2.675 on 7 and 32 DF,  p-value: 0.02675
## Model 6 and Model 7 Comparison

anova(VAS_Model6, VAS_Model7)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     33 17135                           
2     32 16973  1    161.37 0.3042 0.5851

Model 8


## Specifying Model 8

VAS_Model8 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75, data = AcousticData)

## Model 8 Assumption Check

performance::check_model(VAS_Model8)


## Model 8 Summary

summary(VAS_Model8)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.267 -15.867   1.797  15.875  35.281 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            13.7131    24.9259   0.550   0.5862  
Hull_bVSD_25           -2.1928     1.4571  -1.505   0.1425  
Hull_bVSD_75            0.3863     2.8551   0.135   0.8932  
Hull_b                  1.2361     0.8903   1.388   0.1749  
VSA_b                   7.7058     2.9374   2.623   0.0134 *
vowel_ED_b              4.0973    14.3629   0.285   0.7773  
Incoord1              -21.6529    23.0737  -0.938   0.3553  
Hull_bVSD_25:Incoord1  -0.2601     1.7591  -0.148   0.8834  
Hull_bVSD_75:Incoord1   3.5372     5.0497   0.700   0.4889  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.22 on 31 degrees of freedom
Multiple R-squared:  0.379, Adjusted R-squared:  0.2188 
F-statistic: 2.365 on 8 and 31 DF,  p-value: 0.04086
## Model 7 and Model 8 Comparison

anova(VAS_Model7, VAS_Model8)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     32 16973                           
2     31 16709  1    264.47 0.4907 0.4889

Model 9


## Specifying Model 9

VAS_Model9 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b, data = AcousticData)

## Model 9 Assumption Check

performance::check_model(VAS_Model9)


## Model 9 Summary

summary(VAS_Model9)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.224 -14.209   4.443  15.797  35.400 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            15.9000    25.6576   0.620   0.5401  
Hull_bVSD_25           -1.7379     1.7582  -0.988   0.3308  
Hull_bVSD_75            0.1089     2.9495   0.037   0.9708  
Hull_b                  0.8585     1.2011   0.715   0.4803  
VSA_b                   7.7527     2.9764   2.605   0.0142 *
vowel_ED_b              5.2170    14.7346   0.354   0.7258  
Incoord1              -34.3418    35.4508  -0.969   0.3404  
Hull_bVSD_25:Incoord1  -1.2789     2.7848  -0.459   0.6494  
Hull_bVSD_75:Incoord1   4.0525     5.2273   0.775   0.4443  
Hull_b:Incoord1         0.8760     1.8406   0.476   0.6376  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.51 on 30 degrees of freedom
Multiple R-squared:  0.3837,    Adjusted R-squared:  0.1988 
F-statistic: 2.075 on 9 and 30 DF,  p-value: 0.06485
## Model 8 and Model 9 Comparison

anova(VAS_Model8, VAS_Model9)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     31 16709                           
2     30 16584  1    125.23 0.2265 0.6376

Model 10


## Specifying Model 10

VAS_Model10 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b, data = AcousticData)

## Model 10 Assumption Check

performance::check_model(VAS_Model10)


## Model 10 Summary

summary(VAS_Model10)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-41.129 -14.693   2.991  15.841  36.960 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)  
(Intercept)            16.79076   26.15188   0.642   0.5259  
Hull_bVSD_25           -1.75601    1.78484  -0.984   0.3333  
Hull_bVSD_75            0.04151    2.99886   0.014   0.9891  
Hull_b                  0.75103    1.25414   0.599   0.5539  
VSA_b                   9.10491    4.79089   1.900   0.0674 .
vowel_ED_b              4.00968   15.31664   0.262   0.7953  
Incoord1              -31.98544   36.55389  -0.875   0.3888  
Hull_bVSD_25:Incoord1  -1.08148    2.87770  -0.376   0.7098  
Hull_bVSD_75:Incoord1   3.92085    5.31689   0.737   0.4668  
Hull_b:Incoord1         0.96884    1.88513   0.514   0.6112  
VSA_b:Incoord1         -1.87019    5.14318  -0.364   0.7188  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.86 on 29 degrees of freedom
Multiple R-squared:  0.3865,    Adjusted R-squared:  0.1749 
F-statistic: 1.827 on 10 and 29 DF,  p-value: 0.1001
## Model 9 and Model 10 Comparison

anova(VAS_Model9, VAS_Model10)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     30 16584                           
2     29 16508  1    75.269 0.1322 0.7188

Model 11


## Specifying Model 11

VAS_Model11 <- lm(VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
                  Incoord + Incoord*Hull_bVSD_25 + Incoord*Hull_bVSD_75 + Incoord*Hull_b + Incoord*VSA_b + Incoord*vowel_ED_b, data = AcousticData)

## Model 11 Assumption Check

performance::check_model(VAS_Model11)


## Model 11 Summary

summary(VAS_Model11)

Call:
lm(formula = VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + 
    vowel_ED_b + Incoord + Incoord * Hull_bVSD_25 + Incoord * 
    Hull_bVSD_75 + Incoord * Hull_b + Incoord * VSA_b + Incoord * 
    vowel_ED_b, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-40.891 -10.110   1.062  12.791  41.858 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)  
(Intercept)            47.5360    31.4458   1.512   0.1418  
Hull_bVSD_25           -2.1672     1.7510  -1.238   0.2261  
Hull_bVSD_75           -0.5799     2.9363  -0.198   0.8449  
Hull_b                  1.0811     1.2341   0.876   0.3885  
VSA_b                  13.3050     5.2975   2.512   0.0181 *
vowel_ED_b            -20.8152    21.1048  -0.986   0.3324  
Incoord1              -97.1376    52.9541  -1.834   0.0772 .
Hull_bVSD_25:Incoord1  -1.2486     2.7965  -0.447   0.6587  
Hull_bVSD_75:Incoord1   5.3787     5.2378   1.027   0.3133  
Hull_b:Incoord1         0.6902     1.8384   0.375   0.7102  
VSA_b:Incoord1         -8.4322     6.3726  -1.323   0.1965  
vowel_ED_b:Incoord1    49.3281    29.7498   1.658   0.1085  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 23.17 on 28 degrees of freedom
Multiple R-squared:  0.4413,    Adjusted R-squared:  0.2218 
F-statistic: 2.011 on 11 and 28 DF,  p-value: 0.06657
## Model 10 and Model 11 Comparison

anova(VAS_Model10, VAS_Model11)
Analysis of Variance Table

Model 1: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b
Model 2: VAS ~ Hull_bVSD_25 + Hull_bVSD_75 + Hull_b + VSA_b + vowel_ED_b + 
    Incoord + Incoord * Hull_bVSD_25 + Incoord * Hull_bVSD_75 + 
    Incoord * Hull_b + Incoord * VSA_b + Incoord * vowel_ED_b
  Res.Df   RSS Df Sum of Sq      F Pr(>F)
1     29 16508                           
2     28 15032  1      1476 2.7493 0.1085

New Final VAS Model

Since VAS Model 6 was significantly better fit than Model 5, we fit a new final parsimonious model for VAS to the data (VAS ~ VSA_b + Incoord) and compared that to the old final VAS model (VAS ~ VSA_b). The new final model was not a significantly better fit than the old final model. Thus the old final model (VAS ~ VSA_b) is retained.


## Specifying New Final VAS Model

VAS_Model_newfinal <- lm(VAS ~ VSA_b + Incoord, data = AcousticData)

## New Final VAS Model Assumption Check

performance::check_model(VAS_Model_newfinal)


## New Final VAS Model Summary

summary(VAS_Model_newfinal)

Call:
lm(formula = VAS ~ VSA_b + Incoord, data = AcousticData)

Residuals:
    Min      1Q  Median      3Q     Max 
-42.770 -17.018   3.197  18.896  40.044 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   25.305      8.498   2.978 0.005097 ** 
VSA_b          7.680      1.925   3.990 0.000301 ***
Incoord1     -14.624      7.873  -1.858 0.071190 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 22.54 on 37 degrees of freedom
Multiple R-squared:  0.3012,    Adjusted R-squared:  0.2635 
F-statistic: 7.975 on 2 and 37 DF,  p-value: 0.001319
## Comparison to Old Final Model

anova(VAS_Model_final, VAS_Model_newfinal)
Analysis of Variance Table

Model 1: VAS ~ VSA_b
Model 2: VAS ~ VSA_b + Incoord
  Res.Df   RSS Df Sum of Sq      F  Pr(>F)  
1     38 20556                              
2     37 18802  1    1753.6 3.4509 0.07119 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Testing Individual Predictors

Because some correlations between predictors are high. We run a series of simple linear regressions to test if the predictors significantly predict each intelligibility measure on their own (VSD 25 and VSA models were already complete in our initial model comparison approach)

Orthographic Transcription Models


# OT ~ VSD 75

OT_vsd75_model <- lm(transAcc ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(OT_vsd75_model)
summary(OT_vsd75_model)

# OT ~ Hull

OT_hull_model <- lm(transAcc ~ Hull_b, data = AcousticData)
performance::check_model(OT_hull_model)
summary(OT_hull_model)

# OT ~ Corner Dispersion

OT_disp_model <- lm(transAcc ~ vowel_ED_b, data = AcousticData)
performance::check_model(OT_disp_model)
summary(OT_disp_model)

VAS Models


# VAS ~ VSD 75

VAS_vsd75_model <- lm(VAS ~ Hull_bVSD_75, data = AcousticData)
performance::check_model(VAS_vsd75_model)
summary(VAS_vsd75_model)

# VAS ~ Hull

VAS_hull_model <- lm(VAS ~ Hull_b, data = AcousticData)
performance::check_model(VAS_hull_model)
summary(VAS_hull_model)

# VAS ~ Corner Dispersion

VAS_disp_model <- lm(VAS ~ vowel_ED_b, data = AcousticData)
performance::check_model(VAS_disp_model)
summary(VAS_disp_model)

Listener Demographic Information


ListenerDemo <- Listeners %>%
  furniture::table1(age, gender, race, ethnicity)

ListenerDemo

Speaker Demographics


SpeakerDemo <- AcousticData %>%
  dplyr::select(c(Speaker, Sex, Etiology))

Ages <- rio::import("Prepped Data/Speaker Ages.xlsx")

SpeakerDemo <- full_join(SpeakerDemo, Ages, by = "Speaker")

SpeakerDemoInfo <- SpeakerDemo %>%
  furniture::table1(Sex, Etiology, Age, na.rm = F)

SpeakerDemoInfo

SpeakerDemo %>%
  dplyr::summarize(mean_age = mean(Age, na.rm = T), age_sd = sd(Age, na.rm = T), age_range = range(Age, na.rm = T))
LS0tCnRpdGxlOiAiVm93ZWwgQWNvdXN0aWNzIGFzIFByZWRpY3RvcnMgb2YgU3BlZWNoIEludGVsbGlnaWJpbGl0eSBpbiBEeXNhcnRocmlhOiBBbHRlcm5hdGUgQW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgdGhlIGNvZGUgZm9yIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBmb3IgIlZvd2VsIEFjb3VzdGljcyBhcyBQcmVkaWN0b3JzIG9mIFNwZWVjaCBJbnRlbGxpZ2liaWxpdHkgaW4gRHlzYXJ0aHJpYS4iCgojIExvYWRpbmcgUGFja2FnZXMKCmBgYHtyfQoKbGlicmFyeShyaW8pCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGlycikgIyBpbnN0YWxsLnBhY2thZ2VzKCdpcnInKQpsaWJyYXJ5KHBlcmZvcm1hbmNlKQpsaWJyYXJ5KGNhcikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoIkhtaXNjIikgIyBpbnN0YWxsLnBhY2thZ2VzKCdIbWlzYycpCmxpYnJhcnkoZ2dyaWRnZXMpCmxpYnJhcnkoZnVybml0dXJlKSAjIGluc3RhbGwucGFja2FnZXMoJ2Z1cm5pdHVyZScpCmxpYnJhcnkoZ3QpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGtzKQpsaWJyYXJ5KGVtdVIpICMgaW5zdGFsbC5wYWNrYWdlcygnZW11UicpCmxpYnJhcnkoZ2VvbXRleHRwYXRoKSAjIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJBbGxhbkNhbWVyb24vZ2VvbXRleHRwYXRoIikKCmBgYAoKIyBVcGxvYWQgRGF0YXNldHMKCmBgYHtyfQoKUmVsaWFiaWxpdHkgPC0gcmlvOjppbXBvcnQoIlByZXBwZWQgRGF0YS9SZWxpYWJpbGl0eSBEYXRhLmNzdiIpCkFjb3VzdGljRGF0YSA8LSByaW86OmltcG9ydCgiUHJlcHBlZCBEYXRhL0Fjb3VzdGljTWVhc3VyZXMuY3N2IikgJT4lCiAgZHBseXI6Om11dGF0ZShpbnREaWZmID0gVkFTIC0gdHJhbnNBY2MpCgpBY291c3RpY0RhdGEgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoIWdyZXBsKCJfcmVsIiwgU3BlYWtlcikpICU+JQogIGRwbHlyOjpzZWxlY3QoYyhTcGVha2VyLCBTZXgsIEV0aW9sb2d5LCB2b3dlbF9FRF9iLCBWU0FfYiwgSHVsbF9iLCBIdWxsX2JWU0RfMjUsIEh1bGxfYlZTRF81MCwgSHVsbF9iVlNEXzc1LCBWQVMsIHRyYW5zQWNjKSkKCkxpc3RlbmVycyA8LSByaW86OmltcG9ydCgiUHJlcHBlZCBEYXRhL0xpc3RlbmVyX0RlbW9ncmFwaGljcy5jc3YiKSAlPiUKICBkcGx5cjo6c2VsZWN0KCFjKFN0YXJ0RGF0ZTpwcm9sb2ZpY0lELCBRMi40XzZfVEVYVCwgUTMuMl84X1RFWFQsIEF1ZGlvQ2hlY2s6RVAzKSkKCkxpc3RlbmVycyRyYWNlW0xpc3RlbmVycyRRMy4zXzdfVEVYVCA9PSAiTmF0aXZlIEFtZXJpY2FuLyBBZnJpY2FuIGFtZXJjaW5nIl0gPC0gIkJpcmFjaWFsIG9yIE11bHRpcmFjaWFsIgpgYGAKCiMgQWx0ZXJuYXRlIEFuYWx5c2lzCgpJbiB0aGlzIGFsdGVybmF0ZSBhbmFseXNpcywgd2UgYXJlIGxvb2tpbmcgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIGFjb3VzdGljIG1lYXN1cmVzIHdpdGggc3BlZWNoIGludGVsbGlnaWJpbGl0eSBmb3IgdGhlIEFMUy9QRCBhbmQgdGhlIEhEL0F0YXhpYyBzcGVha2VycyBzZXBhcmF0ZWx5LiBXZSBjcmVhdGUgYSBuZXcgdmFyaWFibGUgY2FsbGVkIEluY29vcmQsIHdoZXJlIHRoZSBBTFMvUEQgU3BlYWtlcnMgYXJlIHNldCBhcyB0aGUgcmVmZXJlbmNlIGdyb3VwIChpbiBvcmRlciB0byBjb21wYXJlIHRvIHRoZSBBdGF4aWMvSEQgU3BlYWtlciBHcm91cCkuIEdyb3VwIENvbXBhcmlzb25zLCBhZGRpdGlvbmFsIGRhdGEgdmlzdWFsaXphdGlvbnMsIGFuZCBmdXJ0aGVyIGxpbmVhciBtb2RlbCBjb21wYXJpc29ucyBhcmUgY29tcGxldGVkLgoKIyMgRGF0YSBQcmVwCgpgYGB7cn0KCiMgQ3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gQWNvdXN0aWNEYXRhLiBJbmNvb3JkIGlzIGEgZHVtbXkgdmFyaWFibGUuIEFMUy9QRCBTcGVha2VycyA9IDAsIEhEL0F0YXhpYyA9IDEKCkFjb3VzdGljRGF0YSA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gY2FzZV93aGVuKEV0aW9sb2d5ID09ICJIRCIgfiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGlvbG9neSA9PSAiQXRheGljIiB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lCiAgZHBseXI6Om11dGF0ZShJbmNvb3JkID0gYXMuZmFjdG9yKEluY29vcmQpKQoKYGBgCgojIyBEZXNjcmlwdGl2ZXMgCgpgYGB7cn0KCkRlc2NyaXB0aXZlc19BTFMuUERfaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KEluY29vcmQpICU+JQogIGRwbHlyOjpzdW1tYXJpemUoVlNBX21lYW4gPSBtZWFuKFZTQV9iLCBuYS5ybSA9VCksIFZTQV9zZCA9IHNkKFZTQV9iLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgICAgRGlzcF9tZWFuID0gbWVhbih2b3dlbF9FRF9iLCBuYS5ybSA9VCksIERpc3Bfc2QgPSBzZCh2b3dlbF9FRF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBIdWxsX21lYW4gPSBtZWFuKEh1bGxfYiwgbmEucm0gPVQpLCBIdWxsX3NkID0gc2QoSHVsbF9iLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0QyNV9tZWFuID0gbWVhbihIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwgVlNEMjVfc2QgPSBzZChIdWxsX2JWU0RfMjUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDUwX21lYW4gPSBtZWFuKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLCBWU0Q1MF9zZCA9IHNkKEh1bGxfYlZTRF81MCwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENzVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksIFZTRDc1X3NkID0gc2QoSHVsbF9iVlNEXzc1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWQVNfbWVhbiA9IG1lYW4oVkFTLCBuYS5ybSA9VCksIFZBU19zZCA9IHNkKFZBUywgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgT1RfbWVhbiA9IG1lYW4odHJhbnNBY2MsIG5hLnJtID1UKSwgT1Rfc2QgPSBzZCh0cmFuc0FjYywgbmEucm0gPVQpKQoKRGVzY3JpcHRpdmVzX0FMUy5QRF9pbmNvb3JkCgpgYGAKCiMjIERhdGEgVmlzCgojIyMgR3JvdXAgQ29tcGFyaXNvbiBSaWRnZWxpbmUgUGxvdHMKCmBgYHtyfQoKIyBWU0EgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKVlNBX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvcm5lciBEaXNwZXJzaW9uIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCmRpc3BfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgSHVsbCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpodWxsX2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBWU0QgMjUgUmlkZ2VsaW5lIFBsb3QgYnkgSW5jb29yZGluYXRpb24gKEluY29vcmQgPSAwIGFyZSBBTFMvUEQgU3BlYWtlcnMsIEluY29vcmQgPT0gMSBhcmUgSEQvQXRheGljIFNwZWFrZXJzKQoKdnNkMjVfaW5jb29yZC5wbG90IDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSBJbmNvb3JkLAogICAgICBjb2xvciA9IEluY29vcmQsCiAgICAgIGZpbGwgPSBJbmNvb3JkKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhqaXR0ZXJlZF9wb2ludHMgPSBULCAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fcG9pbnRzX2ppdHRlcih3aWR0aCA9IDAuMDEsIGhlaWdodCA9IDApLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NoYXBlID0gJ3wnLCAKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSA1LAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfYWxwaGEgPSAxLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjcsCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IC43KSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVzbml0eSAyNSAoQmFyaykiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIFZTRCA1MCBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgp2c2Q1MF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYlZTRF81MCwKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZXNuaXR5IDUwIChCYXJrKSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVlNEIDc1IFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKCnZzZDc1X2luY29vcmQucGxvdCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlc25pdHkgNzUgKEJhcmspIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBSaWRnZWxpbmUgUGxvdCBieSBJbmNvb3JkaW5hdGlvbiAoSW5jb29yZCA9IDAgYXJlIEFMUy9QRCBTcGVha2VycywgSW5jb29yZCA9PSAxIGFyZSBIRC9BdGF4aWMgU3BlYWtlcnMpCgpPVF9pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHRyYW5zQWNjLAogICAgICB5ID0gSW5jb29yZCwKICAgICAgY29sb3IgPSBJbmNvb3JkLAogICAgICBmaWxsID0gSW5jb29yZCkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXMoaml0dGVyZWRfcG9pbnRzID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3BvaW50c19qaXR0ZXIod2lkdGggPSAwLjAxLCBoZWlnaHQgPSAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaGFwZSA9ICd8JywgCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9zaXplID0gNSwKICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2FscGhhID0gMSwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC43LAogICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAuNykgKwogIHhsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgVmlzdWFsIEFuYWxvZyBTY2FsZSBJbnRlbGxpZ2liaWxpdHkgUmF0aW5nIFJpZGdlbGluZSBQbG90IGJ5IEluY29vcmRpbmF0aW9uIChJbmNvb3JkID0gMCBhcmUgQUxTL1BEIFNwZWFrZXJzLCBJbmNvb3JkID09IDEgYXJlIEhEL0F0YXhpYyBTcGVha2VycykKClZBU19pbmNvb3JkLnBsb3QgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZBUywKICAgICAgeSA9IEluY29vcmQsCiAgICAgIGNvbG9yID0gSW5jb29yZCwKICAgICAgZmlsbCA9IEluY29vcmQpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKGppdHRlcmVkX3BvaW50cyA9IFQsIAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9wb2ludHNfaml0dGVyKHdpZHRoID0gMC4wMSwgaGVpZ2h0ID0gMCksIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2hhcGUgPSAnfCcsIAogICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBwb2ludF9hbHBoYSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNywKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gLjcpICsKICB4bGFiKCJSYXRpZ25zIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDcmVhdGluZyBEaXN0cmlidXRpb25zIGJ5IEluY29vcmQgRmlndXJlCgpEaXN0cmlidXRpb25zX2luY29vcmQgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoVlNBX2luY29vcmQucGxvdCwgZGlzcF9pbmNvb3JkLnBsb3QsIGh1bGxfaW5jb29yZC5wbG90LCB2c2QyNV9pbmNvb3JkLnBsb3QsIHZzZDUwX2luY29vcmQucGxvdCwgdnNkNzVfaW5jb29yZC5wbG90LCBPVF9pbmNvb3JkLnBsb3QsIFZBU19pbmNvb3JkLnBsb3QsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNCkKCiMgU2F2aW5nIERpc3RyaWJ1dGlvbiBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvRGlzdHJpYnV0aW9uX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdCA9ICJpbiIpCgpgYGAKCiMjIyBTY2F0dGVycGxvdHMKCmBgYHtyfQoKIyBPVCBTY2F0dGVycGxvdHMgYnkgSW5jb29yZAoKT1RfVlNBLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IFZTQV9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGdndGl0bGUoIk9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQoKT1RfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiQ29ybmVyIERpc3BlcnNpb24gKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF9IdWxsLmluY29vcmQgPC0gQWNvdXN0aWNEYXRhICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IEh1bGxfYiwKICAgICAgeSA9IHRyYW5zQWNjLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlBlcmNlbnQgV29yZHMgQ29ycmVjdCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpPVF92c2QyNS5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBIdWxsX2JWU0RfMjUsCiAgICAgIHkgPSB0cmFuc0FjYywKICAgICAgY29sb3IgPSBJbmNvb3JkKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICB4bGFiKCJWb3dlbCBTcGFjZSBEZW5zaXR5IDI1IChCYXJrKSIpICsKICB5bGFiKCJQZXJjZW50IFdvcmRzIENvcnJlY3QiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKT1RfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gdHJhbnNBY2MsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgRGVuc2l0eSA3NSAoQmFyaykiKSArCiAgeWxhYigiUGVyY2VudCBXb3JkcyBDb3JyZWN0IikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwMCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCgojIFZBUyBTY2F0dGVycGxvdHMKClZBU19WU0EuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gVlNBX2IsCiAgICAgIHkgPSBWQVMsCiAgICAgIGNvbG9yID0gSW5jb29yZCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgeGxhYigiVm93ZWwgU3BhY2UgQXJlYSAoQmFyaykiKSArCiAgeWxhYigiVkFTIFNjb3JlIikgKwogIGdndGl0bGUoIlZpc3VhbCBBbmFsb2cgU2NhbGUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIikpCgpWQVNfZGlzcC5pbmNvb3JkIDwtIEFjb3VzdGljRGF0YSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB2b3dlbF9FRF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIkNvcm5lciBEaXNwZXJzaW9uIChCYXJrKSIpICsKICB5bGFiKCJWQVMgU2NvcmUiKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKVkFTX0h1bGwuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iLAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIEh1bGwgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkMjUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzI1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgMjUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgpWQVNfdnNkNzUuaW5jb29yZCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gSHVsbF9iVlNEXzc1LAogICAgICB5ID0gVkFTLAogICAgICBjb2xvciA9IEluY29vcmQpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIHhsYWIoIlZvd2VsIFNwYWNlIERlbnNpdHkgNzUgKEJhcmspIikgKwogIHlsYWIoIlZBUyBTY29yZSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDApKSArCiAgdGhlbWVfY2xhc3NpYygpCgoKIyBDcmVhdGluZyBTY2F0dGVycGxvdCBGaWd1cmUKClNjYXR0ZXJwbG90c19pbmNvb3JkIDwtIGdncHVicjo6Z2dhcnJhbmdlKE9UX1ZTQS5pbmNvb3JkLCBWQVNfVlNBLmluY29vcmQsIE9UX2Rpc3AuaW5jb29yZCwgVkFTX2Rpc3AuaW5jb29yZCwgT1RfSHVsbC5pbmNvb3JkLCBWQVNfSHVsbC5pbmNvb3JkLCBPVF92c2QyNS5pbmNvb3JkLCBWQVNfdnNkMjUuaW5jb29yZCwgT1RfdnNkNzUuaW5jb29yZCwgVkFTX3ZzZDc1LmluY29vcmQsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICBucm93ID0gNSkKCiMjIFNhdmluZyBTY2F0dGVycGxvdCBGaWd1cmUKCmdnc2F2ZSgiUGxvdHMvU2NhdHRlcnBsb3RzX2luY29vcmQucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAyMCwgdW5pdCA9ICJpbiIsIHNjYWxlID0gLjUpCgoKYGBgCgoKIyMgR3JvdXAgQ29tcGFyaXNvbnMgLSA0IEdyb3VwcwojIyMgTWVhbnMgYW5kIFNECgpgYGB7cn0KCkFjb3VzdGljRGF0YSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2V4LCBFdGlvbG9neSkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KFNleCkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShWU0FfbWVhbiA9IG1lYW4oVlNBX2IsIG5hLnJtID1UKSwgVlNBX3NkID0gc2QoVlNBX2IsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICBEaXNwX21lYW4gPSBtZWFuKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwgRGlzcF9zZCA9IHNkKHZvd2VsX0VEX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIEh1bGxfbWVhbiA9IG1lYW4oSHVsbF9iLCBuYS5ybSA9VCksIEh1bGxfc2QgPSBzZChIdWxsX2IsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDI1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLCBWU0QyNV9zZCA9IHNkKEh1bGxfYlZTRF8yNSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNENTBfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksIFZTRDUwX3NkID0gc2QoSHVsbF9iVlNEXzUwLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q3NV9tZWFuID0gbWVhbihIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwgVlNENzVfc2QgPSBzZChIdWxsX2JWU0RfNzUsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZBU19tZWFuID0gbWVhbihWQVMsIG5hLnJtID1UKSwgVkFTX3NkID0gc2QoVkFTLCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBPVF9tZWFuID0gbWVhbih0cmFuc0FjYywgbmEucm0gPVQpLCBPVF9zZCA9IHNkKHRyYW5zQWNjLCBuYS5ybSA9VCkpCgpBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6Omdyb3VwX2J5KEV0aW9sb2d5KSAlPiUKICBkcGx5cjo6c3VtbWFyaXplKFZTQV9tZWFuID0gbWVhbihWU0FfYiwgbmEucm0gPVQpLCBWU0Ffc2QgPSBzZChWU0FfYiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgIERpc3BfbWVhbiA9IG1lYW4odm93ZWxfRURfYiwgbmEucm0gPVQpLCBEaXNwX3NkID0gc2Qodm93ZWxfRURfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgSHVsbF9tZWFuID0gbWVhbihIdWxsX2IsIG5hLnJtID1UKSwgSHVsbF9zZCA9IHNkKEh1bGxfYiwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVlNEMjVfbWVhbiA9IG1lYW4oSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksIFZTRDI1X3NkID0gc2QoSHVsbF9iVlNEXzI1LCBuYS5ybSA9VCksCiAgICAgICAgICAgICAgICAgICBWU0Q1MF9tZWFuID0gbWVhbihIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwgVlNENTBfc2QgPSBzZChIdWxsX2JWU0RfNTAsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIFZTRDc1X21lYW4gPSBtZWFuKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLCBWU0Q3NV9zZCA9IHNkKEh1bGxfYlZTRF83NSwgbmEucm0gPVQpLAogICAgICAgICAgICAgICAgICAgVkFTX21lYW4gPSBtZWFuKFZBUywgbmEucm0gPVQpLCBWQVNfc2QgPSBzZChWQVMsIG5hLnJtID1UKSwKICAgICAgICAgICAgICAgICAgIE9UX21lYW4gPSBtZWFuKHRyYW5zQWNjLCBuYS5ybSA9VCksIE9UX3NkID0gc2QodHJhbnNBY2MsIG5hLnJtID1UKSkKCgpgYGAKCiMjIyBBY291c3RpYyBNZWFzdXJlcwpWU0EKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbApWU0FfZ3JvdXAgPC0gYW92KFZTQV9iIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KFZTQV9ncm91cCwgMSkKcGxvdChWU0FfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChWU0FfZ3JvdXApClZTQV9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IFZTQV9ncm91cCkKc2hhcGlyby50ZXN0KFZTQV9yZXNpZHVhbHMpCgojIyBNb2RlbCBSZXN1bHRzCgpzdW1tYXJ5KFZTQV9ncm91cCkKCiMjIEtydXNrYWwtV2FsbGlzIFRlc3QgCgprcnVza2FsLnRlc3QoVlNBX2IgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIFBhaXJ3aXNlIENvbXBhcmlzb25zCgpwYWlyd2lzZS53aWxjb3gudGVzdChBY291c3RpY0RhdGEkVlNBX2IsIEFjb3VzdGljRGF0YSRFdGlvbG9neSwgcC5hZGp1c3QubWV0aG9kID0gImJvbmZlcnJvbmkiKQoKYGBgCgpDb3JuZXIgRGlzcGVyc2lvbgpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCmRpc3BfZ3JvdXAgPC0gYW92KHZvd2VsX0VEX2IgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEFzc3VtcHRpb24gQ2hlY2sKCnBsb3QoZGlzcF9ncm91cCwgMSkKcGxvdChkaXNwX2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QoZGlzcF9ncm91cCkKZGlzcF9yZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG9iamVjdCA9IGRpc3BfZ3JvdXApCnNoYXBpcm8udGVzdChkaXNwX3Jlc2lkdWFscykKCiMjIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkoZGlzcF9ncm91cCkKCmBgYAoKSHVsbApgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCmh1bGxfZ3JvdXAgPC0gYW92KEh1bGxfYiB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgQXNzdW1wdGlvbiBDaGVjawoKcGxvdChodWxsX2dyb3VwLCAxKQpwbG90KGh1bGxfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdChodWxsX2dyb3VwKQpodWxsX3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gaHVsbF9ncm91cCkKc2hhcGlyby50ZXN0KGh1bGxfcmVzaWR1YWxzKQoKIyMgTW9kZWwgUmVzdWx0cwoKc3VtbWFyeShodWxsX2dyb3VwKQoKYGBgCgpWU0QgMjUKYGBge3J9CgojIyBTcGVjaWZ5IHRoZSBNb2RlbAp2c2QyNV9ncm91cCA8LSBhb3YoSHVsbF9iVlNEXzI1IH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBBc3N1bXB0aW9uIENoZWNrCgpwbG90KHZzZDI1X2dyb3VwLCAxKQpwbG90KHZzZDI1X2dyb3VwLCAyKQpjYXI6OmxldmVuZVRlc3QodnNkMjVfZ3JvdXApCnZzZDI1X3Jlc2lkdWFscyA8LSByZXNpZHVhbHMob2JqZWN0ID0gdnNkMjVfZ3JvdXApCnNoYXBpcm8udGVzdCh2c2QyNV9yZXNpZHVhbHMpCgojIyBNb2RlbCBTdW1tYXJ5CgpzdW1tYXJ5KHZzZDI1X2dyb3VwKQoKCmBgYAoKClZTRCA1MApgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCnZzZDUwX2dyb3VwIDwtIGFvdihIdWxsX2JWU0RfNTAgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEFzc3VtcHRpb24gQ2hlY2sKCnBsb3QodnNkNTBfZ3JvdXAsIDEpCnBsb3QodnNkNTBfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdCh2c2Q1MF9ncm91cCkKdnNkNTBfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSB2c2Q1MF9ncm91cCkKc2hhcGlyby50ZXN0KHZzZDUwX3Jlc2lkdWFscykKCiMjIE1vZGVsIFJlc3VsdHMKCnN1bW1hcnkodnNkNTBfZ3JvdXApCgojIyBLcnVza2FsIFdhbGxpcyBUZXN0CgprcnVza2FsLnRlc3QoSHVsbF9iVlNEXzUwIH4gRXRpb2xvZ3ksIGRhdGEgPSBBY291c3RpY0RhdGEpCgpgYGAKClZTRCA3NQpgYGB7cn0KCiMjIFNwZWNpZnkgdGhlIE1vZGVsCnZzZDc1X2dyb3VwIDwtIGFvdihIdWxsX2JWU0RfNzUgfiBFdGlvbG9neSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIEFzc3VtcHRpb24gQ2hlY2sKCnBsb3QodnNkNzVfZ3JvdXAsIDEpCnBsb3QodnNkNzVfZ3JvdXAsIDIpCmNhcjo6bGV2ZW5lVGVzdCh2c2Q3NV9ncm91cCkKdnNkNzVfcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhvYmplY3QgPSB2c2Q3NV9ncm91cCkKc2hhcGlyby50ZXN0KHZzZDc1X3Jlc2lkdWFscykKCiMjIE1vZGVsIFN1bW1hcnkKCnN1bW1hcnkodnNkNzVfZ3JvdXApCgojIyBLcnVza2FsIFdhbGxpcwoKa3J1c2thbC50ZXN0KEh1bGxfYlZTRF83NSB+IEV0aW9sb2d5LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKYGBgCgojIyBHcm91cCBDb21wYXJpc29ucyAtIDIgR3JvdXBzCiMjIyBUd28gRGF0YWZyYW1lcyBmb3IgSW5jb29yZCBHcm91cHMKCmBgYHtyfQoKY29vcmQuZ3JvdXAgPC0gQWNvdXN0aWNEYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoSW5jb29yZCA9PSAwKQoKaW5jb29yZC5ncm91cCA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OmZpbHRlcihJbmNvb3JkID09IDEpCgpgYGAKCgojIyMgVlNBCgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZTQV9iW0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC5WU0EgPC0gdmFyLnRlc3QoVlNBX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuVlNBCgojIE1vZGVsIFJlc3VsdHMKClZTQV9iX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkVlNBX2IsIGNvb3JkLmdyb3VwJFZTQV9iLCB2YXIuZXF1YWwgPSBUKQpWU0FfYl90CgpgYGAKCiMjIyBDb3JuZXIgRGlzcGVyc2lvbgoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh2b3dlbF9FRF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KHZvd2VsX0VEX2JbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LmRpc3AgPC0gdmFyLnRlc3Qodm93ZWxfRURfYiB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5kaXNwCgojIE1vZGVsIFJlc3VsdHMKCmRpc3BfdCA8LSB0LnRlc3QoaW5jb29yZC5ncm91cCR2b3dlbF9FRF9iLCBjb29yZC5ncm91cCR2b3dlbF9FRF9iLCB2YXIuZXF1YWwgPSBUKQpkaXNwX3QKCmBgYAoKIyMjIEh1bGwKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYltJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuaHVsbCA8LSB2YXIudGVzdChIdWxsX2IgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuaHVsbAoKIyBNb2RlbCBSZXN1bHRzCgpodWxsX3QgPC0gdC50ZXN0KGluY29vcmQuZ3JvdXAkSHVsbF9iLCBjb29yZC5ncm91cCRIdWxsX2IsIHZhci5lcXVhbCA9IFQpCmh1bGxfdAoKYGBgCgojIyMgVlNEIDI1CgpgYGB7cn0KCiMgQXNzdW1wdGlvbiBDaGVjawoKIyMgQ2hlY2tpbmcgTm9ybWFsaXR5Cgp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF8yNVtJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfMjVbSW5jb29yZCA9PSAxXSkpCgojIyBFcXVhbCBWYXJpYW5jZSBDaGVjawoKcmVzLmZ0ZXN0LnZzZDI1IDwtIHZhci50ZXN0KEh1bGxfYlZTRF8yNSB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC52c2QyNQoKIyBNb2RlbCBSZXN1bHRzCgp2c2QyNV90IDwtIHQudGVzdChpbmNvb3JkLmdyb3VwJEh1bGxfYlZTRF8yNSwgY29vcmQuZ3JvdXAkSHVsbF9iVlNEXzI1LCB2YXIuZXF1YWwgPSBUKQp2c2QyNV90CgpgYGAKCiMjIyBWU0QgNTAKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzUwW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KEh1bGxfYlZTRF81MFtJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QudnNkNTAgPC0gdmFyLnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcmVzLmZ0ZXN0LnZzZDUwCgojIE1vZGVsIFJlc3VsdHMgKE1hbm4tV2hpdG5leSBVIHRlc3QgY29uZHVjdGVkIHNpbmNlIGFzc3VtcHRpb24gb2Ygbm9ybWFsaXR5IGlzIHZpb2xhdGVkKQoKdnNkNTBfTVcgPC0gd2lsY294LnRlc3QoSHVsbF9iVlNEXzUwIH4gSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKdnNkNTBfTVcKCmBgYAoKIyMjIFZTRCA3NQoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdChIdWxsX2JWU0RfNzVbSW5jb29yZCA9PSAwXSkpCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoSHVsbF9iVlNEXzc1W0luY29vcmQgPT0gMV0pKQoKIyMgRXF1YWwgVmFyaWFuY2UgQ2hlY2sKCnJlcy5mdGVzdC52c2Q3NSA8LSB2YXIudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QudnNkNzUKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgp2c2Q3NV9NVyA8LSB3aWxjb3gudGVzdChIdWxsX2JWU0RfNzUgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQp2c2Q3NV9NVwoKCmBgYAoKIyMjIE9ydGhvZ3JhcGhpYyBUcmFuc2NyaXB0aW9uIFNjb3JlcwoKYGBge3J9CgojIEFzc3VtcHRpb24gQ2hlY2sKCiMjIENoZWNraW5nIE5vcm1hbGl0eQoKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDBdKSkKd2l0aChBY291c3RpY0RhdGEsIHNoYXBpcm8udGVzdCh0cmFuc0FjY1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuT1QgPC0gdmFyLnRlc3QodHJhbnNBY2MgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpyZXMuZnRlc3QuT1QKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdCh0cmFuc0FjYyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCk9UX01XCgpgYGAKCiMjIyBWQVMKCmBgYHtyfQoKIyBBc3N1bXB0aW9uIENoZWNrCgojIyBDaGVja2luZyBOb3JtYWxpdHkKCndpdGgoQWNvdXN0aWNEYXRhLCBzaGFwaXJvLnRlc3QoVkFTW0luY29vcmQgPT0gMF0pKQp3aXRoKEFjb3VzdGljRGF0YSwgc2hhcGlyby50ZXN0KFZBU1tJbmNvb3JkID09IDFdKSkKCiMjIEVxdWFsIFZhcmlhbmNlIENoZWNrCgpyZXMuZnRlc3QuVkFTIDwtIHZhci50ZXN0KFZBUyB+IEluY29vcmQsIGRhdGEgPSBBY291c3RpY0RhdGEpCnJlcy5mdGVzdC5WQVMKCiMgTW9kZWwgUmVzdWx0cyAoTWFubi1XaGl0bmV5IFUgdGVzdCBjb25kdWN0ZWQgc2luY2UgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgdmlvbGF0ZWQpCgpPVF9NVyA8LSB3aWxjb3gudGVzdChWQVMgfiBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpPVF9NVwoKYGBgCgojIyBPVCBBbmFseXNpcwoKU2luY2Ugd2UgZm91bmQgc2lnbmlmaWNhbnQgZ3JvdXAgZGlmZmVyZW5jZXMgZm9yIHNvbWUgYWNvdXN0aWMgbWVhc3VyZXMgYmV0d2VlbiB0aGUgQUxTL1BEIGFuZCBBdGF4aWMvSEQgZ3JvdXBzLCB3ZSBjb250aW51ZWQgdGhlIGhlaXJhcmljaGFsIHJlZ3Jlc3Npb24gYXBwcm9hY2ggZnJvbSBPVCBNb2RlbCA1LiBBZGRpbmcgaW4gdGhlIEluY29vcmQgcHJlZGljdG9yIGFsb25nIHdpdGggdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBhY291c3RpYyBtZWFzdXJlcyBkaWQgbm90IHNpZ25pZmljYW50bHkgaW1wcm92ZSBtb2RlbCBmaXQuIFNvIG91ciBvcmlnaW5hbCBmaW5hbCBPVCBtb2RlbCBpcyByZXRhaW5lZC4KCiMjIyBNb2RlbCA2CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNgoKT1RfTW9kZWw2IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDYgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNikKCiMjIE1vZGVsIDYgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDYpCgojIyBNb2RlbCA1IGFuZCBNb2RlbCA2IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNSwgT1RfTW9kZWw2KQoKYGBgCiMjIyBNb2RlbCA3CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNwoKT1RfTW9kZWw3IDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDcgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsNykKCiMjIE1vZGVsIDcgU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDcpCgojIyBNb2RlbCA2IGFuZCBNb2RlbCA3IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNiwgT1RfTW9kZWw3KQoKYGBgCgojIyMgTW9kZWwgOAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDgKCk9UX01vZGVsOCA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE1vZGVsIDggQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsOCkKCiMjIE1vZGVsIDggU3VtbWFyeQoKc3VtbWFyeShPVF9Nb2RlbDgpCgojIyBNb2RlbCA3IGFuZCBNb2RlbCA4IENvbXBhcmlzb24KCmFub3ZhKE9UX01vZGVsNywgT1RfTW9kZWw4KQoKYGBgCgojIyMgTW9kZWwgOQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDkKCk9UX01vZGVsOSA8LSBsbSh0cmFuc0FjYyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfTW9kZWw5KQoKIyMgTW9kZWwgOSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsOSkKCiMjIE1vZGVsIDggYW5kIE1vZGVsIDkgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWw4LCBPVF9Nb2RlbDkpCgpgYGAKCiMjIyBNb2RlbCAxMAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDEwCgpPVF9Nb2RlbDEwIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTAgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMTApCgojIyBNb2RlbCAxMCBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMTApCgojIyBNb2RlbCA5IGFuZCBNb2RlbCAxMCBDb21wYXJpc29uCgphbm92YShPVF9Nb2RlbDksIE9UX01vZGVsMTApCgpgYGAKCiMjIyBNb2RlbCAxMQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDExCgpPVF9Nb2RlbDExIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iICsgSW5jb29yZCp2b3dlbF9FRF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTEgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX01vZGVsMTEpCgojIyBNb2RlbCAxMSBTdW1tYXJ5CgpzdW1tYXJ5KE9UX01vZGVsMTEpCgojIyBNb2RlbCAxMCBhbmQgTW9kZWwgMTEgQ29tcGFyaXNvbgoKYW5vdmEoT1RfTW9kZWwxMCwgT1RfTW9kZWwxMSkKCmBgYAoKIyMgVkFTIEFuYWx5c2lzCgpTaW5jZSB3ZSBmb3VuZCBzaWduaWZpY2FudCBncm91cCBkaWZmZXJlbmNlcyBmb3Igc29tZSBhY291c3RpYyBtZWFzdXJlcyBiZXR3ZWVuIHRoZSBBTFMvUEQgYW5kIEF0YXhpYy9IRCBncm91cHMsIHdlIGNvbnRpbnVlZCB0aGUgaGllcmFyY2hpY2FsIHJlZ3Jlc3Npb24gYXBwcm9hY2ggZnJvbSBWQVMgTW9kZWwgNS4gVkFTIE1vZGVsIDYgZml0IHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gVkFTIE1vZGVsIDUuIEhvd2V2ZXIsIGFkZGluZyBpbiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gSW5jb29yZCBhbmQgdGhlIGFjb3VzdGljIG1lYXN1cmVzIGRpZCBub3Qgc2lnbmlmaWNhbnRseSBpbXByb3ZlIG1vZGVsIGZpdC4KCiMjIyBNb2RlbCA2CgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTW9kZWwgNgoKVkFTX01vZGVsNiA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyBJbmNvb3JkLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgNiBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsNikKCiMjIE1vZGVsIDYgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw2KQoKIyMgTW9kZWwgNSBhbmQgTW9kZWwgNiBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw1LCBWQVNfTW9kZWw2KQoKCmBgYAoKIyMjIE1vZGVsIDcKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA3CgpWQVNfTW9kZWw3IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCA3IEFzc3VtcHRpb24gQ2hlY2sKCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfTW9kZWw3KQoKIyMgTW9kZWwgNyBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDcpCgojIyBNb2RlbCA2IGFuZCBNb2RlbCA3IENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDYsIFZBU19Nb2RlbDcpCgoKYGBgCgojIyMgTW9kZWwgOAoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDgKClZBU19Nb2RlbDggPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1LCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOCBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsOCkKCiMjIE1vZGVsIDggU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw4KQoKIyMgTW9kZWwgNyBhbmQgTW9kZWwgOCBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw3LCBWQVNfTW9kZWw4KQoKCmBgYAoKIyMjIE1vZGVsIDkKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCA5CgpWQVNfTW9kZWw5IDwtIGxtKFZBUyB+IEh1bGxfYlZTRF8yNSArIEh1bGxfYlZTRF83NSArIEh1bGxfYiArIFZTQV9iICsgdm93ZWxfRURfYiArIAogICAgICAgICAgICAgICAgICBJbmNvb3JkICsgSW5jb29yZCpIdWxsX2JWU0RfMjUgKyBJbmNvb3JkKkh1bGxfYlZTRF83NSArIEluY29vcmQqSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgOSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsOSkKCiMjIE1vZGVsIDkgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWw5KQoKIyMgTW9kZWwgOCBhbmQgTW9kZWwgOSBDb21wYXJpc29uCgphbm92YShWQVNfTW9kZWw4LCBWQVNfTW9kZWw5KQoKYGBgCgojIyMgTW9kZWwgMTAKCmBgYHtyfQoKIyMgU3BlY2lmeWluZyBNb2RlbCAxMAoKVkFTX01vZGVsMTAgPC0gbG0oVkFTIH4gSHVsbF9iVlNEXzI1ICsgSHVsbF9iVlNEXzc1ICsgSHVsbF9iICsgVlNBX2IgKyB2b3dlbF9FRF9iICsgCiAgICAgICAgICAgICAgICAgIEluY29vcmQgKyBJbmNvb3JkKkh1bGxfYlZTRF8yNSArIEluY29vcmQqSHVsbF9iVlNEXzc1ICsgSW5jb29yZCpIdWxsX2IgKyBJbmNvb3JkKlZTQV9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQoKIyMgTW9kZWwgMTAgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbDEwKQoKIyMgTW9kZWwgMTAgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWwxMCkKCiMjIE1vZGVsIDkgYW5kIE1vZGVsIDEwIENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDksIFZBU19Nb2RlbDEwKQoKYGBgCiMjIyBNb2RlbCAxMQoKYGBge3J9CgojIyBTcGVjaWZ5aW5nIE1vZGVsIDExCgpWQVNfTW9kZWwxMSA8LSBsbShWQVMgfiBIdWxsX2JWU0RfMjUgKyBIdWxsX2JWU0RfNzUgKyBIdWxsX2IgKyBWU0FfYiArIHZvd2VsX0VEX2IgKyAKICAgICAgICAgICAgICAgICAgSW5jb29yZCArIEluY29vcmQqSHVsbF9iVlNEXzI1ICsgSW5jb29yZCpIdWxsX2JWU0RfNzUgKyBJbmNvb3JkKkh1bGxfYiArIEluY29vcmQqVlNBX2IgKyBJbmNvb3JkKnZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCgojIyBNb2RlbCAxMSBBc3N1bXB0aW9uIENoZWNrCgpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoVkFTX01vZGVsMTEpCgojIyBNb2RlbCAxMSBTdW1tYXJ5CgpzdW1tYXJ5KFZBU19Nb2RlbDExKQoKIyMgTW9kZWwgMTAgYW5kIE1vZGVsIDExIENvbXBhcmlzb24KCmFub3ZhKFZBU19Nb2RlbDEwLCBWQVNfTW9kZWwxMSkKCmBgYAoKIyMjIE5ldyBGaW5hbCBWQVMgTW9kZWwKClNpbmNlIFZBUyBNb2RlbCA2IHdhcyBzaWduaWZpY2FudGx5IGJldHRlciBmaXQgdGhhbiBNb2RlbCA1LCB3ZSBmaXQgYSBuZXcgZmluYWwgcGFyc2ltb25pb3VzIG1vZGVsIGZvciBWQVMgdG8gdGhlIGRhdGEgKFZBUyB+IFZTQV9iICsgSW5jb29yZCkgYW5kIGNvbXBhcmVkIHRoYXQgdG8gdGhlIG9sZCBmaW5hbCBWQVMgbW9kZWwgKFZBUyB+IFZTQV9iKS4gVGhlIG5ldyBmaW5hbCBtb2RlbCB3YXMgbm90IGEgc2lnbmlmaWNhbnRseSBiZXR0ZXIgZml0IHRoYW4gdGhlIG9sZCBmaW5hbCBtb2RlbC4gVGh1cyB0aGUgb2xkIGZpbmFsIG1vZGVsIChWQVMgfiBWU0FfYikgaXMgcmV0YWluZWQuCgpgYGB7cn0KCiMjIFNwZWNpZnlpbmcgTmV3IEZpbmFsIFZBUyBNb2RlbAoKVkFTX01vZGVsX25ld2ZpbmFsIDwtIGxtKFZBUyB+IFZTQV9iICsgSW5jb29yZCwgZGF0YSA9IEFjb3VzdGljRGF0YSkKCiMjIE5ldyBGaW5hbCBWQVMgTW9kZWwgQXNzdW1wdGlvbiBDaGVjawoKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKFZBU19Nb2RlbF9uZXdmaW5hbCkKCiMjIE5ldyBGaW5hbCBWQVMgTW9kZWwgU3VtbWFyeQoKc3VtbWFyeShWQVNfTW9kZWxfbmV3ZmluYWwpCgojIyBDb21wYXJpc29uIHRvIE9sZCBGaW5hbCBNb2RlbAoKYW5vdmEoVkFTX01vZGVsX2ZpbmFsLCBWQVNfTW9kZWxfbmV3ZmluYWwpCgpgYGAKCiMjIFRlc3RpbmcgSW5kaXZpZHVhbCBQcmVkaWN0b3JzCgpCZWNhdXNlIHNvbWUgY29ycmVsYXRpb25zIGJldHdlZW4gcHJlZGljdG9ycyBhcmUgaGlnaC4gV2UgcnVuIGEgc2VyaWVzIG9mIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbnMgdG8gdGVzdCBpZiB0aGUgcHJlZGljdG9ycyBzaWduaWZpY2FudGx5IHByZWRpY3QgZWFjaCBpbnRlbGxpZ2liaWxpdHkgbWVhc3VyZSBvbiB0aGVpciBvd24gKFZTRCAyNSBhbmQgVlNBIG1vZGVscyB3ZXJlIGFscmVhZHkgY29tcGxldGUgaW4gb3VyIGluaXRpYWwgbW9kZWwgY29tcGFyaXNvbiBhcHByb2FjaCkKCiMjIyBPcnRob2dyYXBoaWMgVHJhbnNjcmlwdGlvbiBNb2RlbHMKCmBgYHtyfQoKIyBPVCB+IFZTRCA3NQoKT1RfdnNkNzVfbW9kZWwgPC0gbG0odHJhbnNBY2MgfiBIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChPVF92c2Q3NV9tb2RlbCkKc3VtbWFyeShPVF92c2Q3NV9tb2RlbCkKCiMgT1QgfiBIdWxsCgpPVF9odWxsX21vZGVsIDwtIGxtKHRyYW5zQWNjIH4gSHVsbF9iLCBkYXRhID0gQWNvdXN0aWNEYXRhKQpwZXJmb3JtYW5jZTo6Y2hlY2tfbW9kZWwoT1RfaHVsbF9tb2RlbCkKc3VtbWFyeShPVF9odWxsX21vZGVsKQoKIyBPVCB+IENvcm5lciBEaXNwZXJzaW9uCgpPVF9kaXNwX21vZGVsIDwtIGxtKHRyYW5zQWNjIH4gdm93ZWxfRURfYiwgZGF0YSA9IEFjb3VzdGljRGF0YSkKcGVyZm9ybWFuY2U6OmNoZWNrX21vZGVsKE9UX2Rpc3BfbW9kZWwpCnN1bW1hcnkoT1RfZGlzcF9tb2RlbCkKCmBgYAoKIyMjIFZBUyBNb2RlbHMKCmBgYHtyfQoKIyBWQVMgfiBWU0QgNzUKClZBU192c2Q3NV9tb2RlbCA8LSBsbShWQVMgfiBIdWxsX2JWU0RfNzUsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfdnNkNzVfbW9kZWwpCnN1bW1hcnkoVkFTX3ZzZDc1X21vZGVsKQoKIyBWQVMgfiBIdWxsCgpWQVNfaHVsbF9tb2RlbCA8LSBsbShWQVMgfiBIdWxsX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfaHVsbF9tb2RlbCkKc3VtbWFyeShWQVNfaHVsbF9tb2RlbCkKCiMgVkFTIH4gQ29ybmVyIERpc3BlcnNpb24KClZBU19kaXNwX21vZGVsIDwtIGxtKFZBUyB+IHZvd2VsX0VEX2IsIGRhdGEgPSBBY291c3RpY0RhdGEpCnBlcmZvcm1hbmNlOjpjaGVja19tb2RlbChWQVNfZGlzcF9tb2RlbCkKc3VtbWFyeShWQVNfZGlzcF9tb2RlbCkKCgpgYGAKIyBMaXN0ZW5lciBEZW1vZ3JhcGhpYyBJbmZvcm1hdGlvbgoKYGBge3J9CgpMaXN0ZW5lckRlbW8gPC0gTGlzdGVuZXJzICU+JQogIGZ1cm5pdHVyZTo6dGFibGUxKGFnZSwgZ2VuZGVyLCByYWNlLCBldGhuaWNpdHkpCgpMaXN0ZW5lckRlbW8KCmBgYAoKIyBTcGVha2VyIERlbW9ncmFwaGljcwoKYGBge3J9CgpTcGVha2VyRGVtbyA8LSBBY291c3RpY0RhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChjKFNwZWFrZXIsIFNleCwgRXRpb2xvZ3kpKQoKQWdlcyA8LSByaW86OmltcG9ydCgiUHJlcHBlZCBEYXRhL1NwZWFrZXIgQWdlcy54bHN4IikKClNwZWFrZXJEZW1vIDwtIGZ1bGxfam9pbihTcGVha2VyRGVtbywgQWdlcywgYnkgPSAiU3BlYWtlciIpCgpTcGVha2VyRGVtb0luZm8gPC0gU3BlYWtlckRlbW8gJT4lCiAgZnVybml0dXJlOjp0YWJsZTEoU2V4LCBFdGlvbG9neSwgQWdlLCBuYS5ybSA9IEYpCgpTcGVha2VyRGVtb0luZm8KClNwZWFrZXJEZW1vICU+JQogIGRwbHlyOjpzdW1tYXJpemUobWVhbl9hZ2UgPSBtZWFuKEFnZSwgbmEucm0gPSBUKSwgYWdlX3NkID0gc2QoQWdlLCBuYS5ybSA9IFQpLCBhZ2VfcmFuZ2UgPSByYW5nZShBZ2UsIG5hLnJtID0gVCkpCgpgYGAK